package com.totoro.tymapping.executor.compute.impl;

import com.totoro.tymapping.TyMapping;
import com.totoro.tymapping.constants.StaticSystemVarConst;
import com.totoro.tymapping.data.ComputeResult;
import com.totoro.tymapping.executor.compute.ComputeExecutor;
import com.totoro.tymapping.utils.JexlUtil;
import com.totoro.tymapping.utils.PapiUtil;
import com.totoro.tymapping.utils.StrUtil;
import com.totoro.tymapping.utils.TagUtil;
import org.bukkit.entity.Player;

/**
 * @author Totoro
 * @version 0.1.0
 * @date 2025/8/13 - 16:50
 * @description
 **/
public class EvalExecutor implements ComputeExecutor {
    @Override
    public ComputeResult execute(TyMapping plugin, String input, Player player) {
        String originEvalStr = extractCompleteEvalTag(input);
        String evalStr = extractEvalTag(input);
        if(null == evalStr) {
            return null;
        }
        // 如果开启了PAPI解析，则先解析一次PAPI
        if(StaticSystemVarConst.dependentPlaceholderAPIEnable) {
            evalStr = PapiUtil.parseStrPapiVariable(player, evalStr);
        }
        // 获取表达式标签里面的内容
        String tagContent = TagUtil.getTagContent(evalStr);
        String[] tagContentSplit = tagContent.split("@");
        // 获取最大值，如果有的话
        Number maxValue = null;
        // 获取最终需要的表达式
        String finalExpression = tagContent;
        if(tagContentSplit.length > 1) {
            finalExpression = tagContentSplit[0];
            maxValue = StrUtil.stringToNumber(tagContentSplit[1]);
        }
        // 计算表达式
        try {
            Number result = (Number) JexlUtil.evaluateExpressions(finalExpression);
            if(null == result) {
                return null;
            }
            // 判断最大值是否为null，如果是null，直接返回
            if(null == maxValue) {
                return new ComputeResult(originEvalStr, result);
            } else {
                // 不为null，判断结果是否大于最大值
                if(result.doubleValue() > maxValue.doubleValue()) {
                    return new ComputeResult(originEvalStr, maxValue);
                } else {
                    return new ComputeResult(originEvalStr, result);
                }
            }
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 提取包含eval:的完整标签字符串（包括eval:前缀）
     * @param input 输入字符串，格式如"防御力: eval:{%player_level% + 1 * 2.5@20} 1"
     * @return 提取到的完整标签，如eval:{%player_level% + 1 * 2.5@20}；未找到则返回null
     */
    public static String extractCompleteEvalTag(String input) {
        if (input == null || input.isEmpty()) {
            return null;
        }

        // 查找"eval:"的起始索引
        int evalStartIndex = input.indexOf("eval:");
        if (evalStartIndex == -1) {
            return null; // 未找到eval:标签
        }

        // 从eval:之后查找第一个空格，确定标签结束位置
        int tagEndIndex = input.indexOf(' ', evalStartIndex);
        if (tagEndIndex == -1) {
            // 如果没有空格，标签结束于字符串末尾
            tagEndIndex = input.length();
        }

        // 截取从eval:开始到结束位置的子串（包含eval:）
        return input.substring(evalStartIndex, tagEndIndex);
    }

    /**
     * 从字符串中提取eval:后面的标签内容
     * @param input 输入字符串，格式如"防御力: eval:{%player_level% + 1 * 2.5@20} 1"
     * @return 提取到的标签字符串，如{%player_level% + 1 * 2.5@20}；若未找到则返回null
     */
    private String extractEvalTag(String input) {
        // 检查输入是否为空
        if (input == null || input.isEmpty()) {
            return null;
        }

        // 查找"eval:"的起始位置
        int evalStart = input.indexOf("eval:");
        if (evalStart == -1) {
            // 未找到"eval:"
            return null;
        }

        // 计算标签内容的起始位置（跳过"eval:"）
        int tagStart = evalStart + "eval:".length();

        // 从标签起始位置开始，查找第一个空格或字符串结尾，确定标签结束位置
        int tagEnd = input.indexOf(' ', tagStart);
        if (tagEnd == -1) {
            // 如果没有空格，则标签一直到字符串结尾
            tagEnd = input.length();
        }

        // 截取标签内容
        return input.substring(tagStart, tagEnd);
    }
}
